const fs = require('fs');
const path = require('path');
const { app } = require('electron');

class Logger {
  constructor() {
    // 确定日志文件路径 - 使用应用安装路径下的logs目录
    // 在开发环境中使用app.getAppPath()，在生产环境中使用process.resourcesPath的父目录
    const appRootPath = app.isPackaged 
      ? path.dirname(process.resourcesPath) 
      : app.getAppPath();
    this.logDir = path.join(appRootPath, 'logs');
    this.logFile = path.join(this.logDir, `app-${new Date().toISOString().split('T')[0]}.log`);
    
    // 确保日志目录存在
    this.ensureLogDirectory();
    
    // 记录应用启动信息
    this.info('应用程序启动');
    this.info(`应用版本: ${app.getVersion()}`);
    this.info(`操作系统: ${process.platform} ${process.arch}`);
    this.info(`Node.js版本: ${process.versions.node}`);
    this.info(`Electron版本: ${process.versions.electron}`);
  }
  
  // 确保日志目录存在
  ensureLogDirectory() {
    try {
      if (!fs.existsSync(this.logDir)) {
        fs.mkdirSync(this.logDir, { recursive: true });
      }
    } catch (error) {
      console.error('创建日志目录失败:', error);
    }
  }
  
  // 写入日志
  log(level, message) {
    const timestamp = new Date().toISOString();
    const logEntry = `[${timestamp}] [${level}] ${message}\n`;
    
    // 同时输出到控制台
    console.log(`[${level}] ${message}`);
    
    // 写入文件
    try {
      fs.appendFileSync(this.logFile, logEntry);
    } catch (error) {
      console.error('写入日志失败:', error);
    }
  }
  
  // 不同级别的日志方法
  info(message) {
    this.log('INFO', message);
  }
  
  warn(message) {
    this.log('WARN', message);
  }
  
  error(message, error) {
    let errorMessage = message;
    if (error) {
      errorMessage += `: ${error.message}`;
      if (error.stack) {
        errorMessage += `\n${error.stack}`;
      }
    }
    this.log('ERROR', errorMessage);
  }
  
  // 记录未捕获的异常
  setupUncaughtExceptionHandler() {
    process.on('uncaughtException', (error) => {
      this.error('未捕获的异常', error);
    });
    
    process.on('unhandledRejection', (reason) => {
      this.error('未处理的Promise拒绝', reason);
    });
  }
}

// 创建单例
const logger = new Logger();
logger.setupUncaughtExceptionHandler();

module.exports = logger;